﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Text;

namespace DragDraw.Service
{
    /// <summary>
    /// 双向通信服务接口
    /// </summary>
    [ServiceContract(Namespace = "Silverlight", CallbackContract = typeof(IUserServiceCallback), SessionMode = SessionMode.Required)]
    public interface IUserDuplexService
    {
        /// <summary>
        /// 让某个用户的某个小工具加入指定会话
        /// </summary>
        /// <param name="sessionData">其body是一个SessionData类型，包含了请求加入的用户ID以及小工具ID</param>
        [OperationContract(IsOneWay = true)]
        void JoinSession(Message sessionData);

        /// <summary>
        /// 小工具使用此方法更新指定会话的数据
        /// 服务器负责将此更新广播到所有使用了JoinSession且WidgetID相同的客户端
        /// </summary>
        /// <param name="sessionData">其body是一个SessionData类型，包括了请求更新的用户、小工具ID、会话名称、会话的数据</param>
        [OperationContract(IsOneWay = true)]
        void UpdateSession(Message sessionData);

        /// <summary>
        /// 客户端每分钟使用此方法告知服务器在线，以保持其所有Session的连接
        /// </summary>
        /// <param name="syncFlag">任意内容，可忽略</param>
        [OperationContract(IsOneWay = true)]
        void SyncSession(Message syncFlag);
    }

    /// <summary>
    /// 会话数据
    /// </summary>
    public class SessionData
    {
        /// <summary>
        /// 请求修改的用户
        /// </summary>
        public string UserID;

        /// <summary>
        /// 使用此会话的小工具
        /// </summary>
        public int WidgetID;
        
        /// <summary>
        /// 会话的名字
        /// </summary>
        public string SessionName;

        /// <summary>
        /// 会话的内容
        /// </summary>
        public string Value;
    }

    /// <summary>
    /// 双向通信回调接口
    /// </summary>
    [ServiceContract]
    public interface IUserServiceCallback
    {
        /// <summary>
        /// 回调函数，服务器通过此函数广播会话更新
        /// </summary>
        /// <param name="sessionData">其body是一个SessionData类型，包括了请求更新的用户、小工具ID、会话名称、会话的数据</param>
        [OperationContract(IsOneWay = true)]
        void OnUpdateSession(Message sessionData);
    }
}